package com.example.xpvideo.service.serviceImpl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.xpvideo.entity.LsIntegralSystem;
import com.example.xpvideo.entity.LsSignIn;
import com.example.xpvideo.entity.LsSignInLog;
import com.example.xpvideo.entity.ResponseResult;
import com.example.xpvideo.entity.req.SignInRecordsReq;
import com.example.xpvideo.enums.ErrCodeEnum;
import com.example.xpvideo.mapper.LsIntegralSystemMapper;
import com.example.xpvideo.mapper.LsSignInLogMapper;
import com.example.xpvideo.mapper.LsSignInMapper;
import com.example.xpvideo.service.LsSignInService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 *
 */
@Service
public class LsSignInServiceImpl extends ServiceImpl<LsSignInMapper, LsSignIn>
        implements LsSignInService {

    @Autowired
    private LsSignInMapper signInMapper;

    @Autowired
    private LsIntegralSystemMapper integralSystemMapper;

    @Autowired
    private LsSignInLogMapper signInLogMapper;

    /**
     * 用户签到
     * @param params
     * @return
     */
    @Override
    @Transactional(rollbackFor = {Exception.class,RuntimeException.class})
    public ResponseResult signInOperation(Map<String, String> params) {
        try {
            String userId = params.get("userId"); // 用户id
            // 查询签到规则
            LsIntegralSystem integralSystem = integralSystemMapper.selectOne(null);
            // 签到日志
            LsSignInLog signInLog = new LsSignInLog();
            if (null != userId && !"".equals(userId)) {
                LsSignIn signIn = signInMapper.selectOne(new QueryWrapper<LsSignIn>().eq("user_id", userId));
                if (null == signIn) {
                    // 该用户第一次签到
                    LsSignIn signIn1 = new LsSignIn();
                    signIn1.setUserId(Integer.parseInt(userId));// 用户id
                    signIn1.setContinueSign(1); // 连续签到天数
                    signIn1.setCreateTime(new Date()); // 创建时间
                    signIn1.setUpdateTime(signIn1.getCreateTime());// 更新时间
                    signIn1.setIntegral(integralSystem.getADay()); // 用户拥有积分,今天签到第一天可以得到多少积分
                    // 生成签到记录
                    signInLog.setUserId(Integer.parseInt(userId)); // 所属用户
                    signInLog.setIntegral(integralSystem.getADay());// 获得积分
                    signInLog.setCreateTime(signIn1.getCreateTime()); // 签到时间
                    signInMapper.insert(signIn1);
                    signInLogMapper.insert(signInLog);
                    return ResponseResult.responseResult(200, "恭喜您获得"+integralSystem.getADay()+"积分!");
                } else {
                    signInLog.setUserId(Integer.parseInt(userId));// 所属用户
                    // 不是第一次签到
                    // 获取上次签到时间
                    Date lastTime = signIn.getUpdateTime();
                    int i = checkAllotSigin(lastTime);// 校验签到
                    switch (i) {
                        case 0:
                            // 0代表未签到且处于连续签到状态
                            if (signIn.getContinueSign() == integralSystem.getDay()) {
                                // 如果连续签到天数到达指定天数可获得更多积分
                                // Integral拥有积分
                                signIn.setIntegral(signIn.getIntegral() + integralSystem.getContinuousSignIn());
                                signIn.setUpdateTime(new Date());// 更新时间
                                signIn.setContinueSign(0);// 领取到连续签到7天奖励后 重置连续签到天数
                                signInMapper.updateById(signIn);
                                // 生成日志
                                signInLog.setIntegral(integralSystem.getContinuousSignIn());// 获得多少积分
                                signInLog.setCreateTime(new Date()); // 签到时间
                                signInLogMapper.insert(signInLog);
                                return ResponseResult.responseResult(200, "恭喜您获得"+integralSystem.getContinuousSignIn()+"积分!");
                            } else {
                                // 如果连续签到天数未到达指定天数
                                signIn.setContinueSign(signIn.getContinueSign() + 1);// 连续签到天数+1
                                signIn.setUpdateTime(new Date()); // 更新时间
                                signIn.setIntegral(integralSystem.getADay());// 正常签到获得积分
                                signInMapper.updateById(signIn);
                                // 生成日志
                                signInLog.setIntegral(integralSystem.getADay());// 获得多少积分
                                signInLog.setCreateTime(new Date()); // 签到时间
                                signInLogMapper.insert(signInLog);
                                return ResponseResult.responseResult(200, "恭喜您获得"+integralSystem.getADay()+"积分!");
                            }
                        case 1:
                            // 返回1代表已签到
                            return ResponseResult.responseResult(200, "今日已签到");
                        case 2:
                            // 2代表未签到但处于断续签到状态
                            signIn.setUpdateTime(new Date());// 更新时间
                            signIn.setIntegral(integralSystem.getADay()); // 获得一天签到奖励
                            signIn.setContinueSign(1); // 连续签到置为1
                            signInMapper.updateById(signIn);
                            // 生成日志
                            signInLog.setIntegral(integralSystem.getADay());// 获得多少积分
                            signInLog.setCreateTime(new Date()); // 签到时间
                            signInLogMapper.insert(signInLog);
                            return ResponseResult.responseResult(200, "恭喜您获得"+integralSystem.getADay()+"积分!");
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ResponseResult.responseResult(ErrCodeEnum.unknown_10001, null);
    }

    /**
     * 查询签到记录
     * @param signInRecordsReq
     * @return
     */
    @Override
    public ResponseResult signInRecords(SignInRecordsReq signInRecordsReq) {
        List<LsSignInLog> signInLogs = signInLogMapper.signInRecords(signInRecordsReq);
        SimpleDateFormat sdf = new SimpleDateFormat("dd");
        List<String> day = signInLogs.stream().map(log -> sdf.format(log.getCreateTime())).collect(Collectors.toList());
        return ResponseResult.responseResult(0,day);
    }

    /**
     * 功能描述: 校验用户当天是否已经签到
     * 返回1代表已签到，0代表未签到且处于连续签到状态 2代表未签到但处于断续签到状态
     * @param date
     * @return int
     * @author hjt
     */
    public int checkAllotSigin(Date date) throws Exception {

        int result = 0;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //将Date类型转换成String类型
        String time = sdf.format(date);
        System.out.println("转换后的时间:" + time);
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
        LocalDateTime localTime = LocalDateTime.parse(time, dtf);
        System.out.println("当前的localTime:" + localTime);
        LocalDateTime startTime = LocalDate.now().atTime(0, 0, 0);
        System.out.println("startTime:" + startTime);
        LocalDateTime endTime = LocalDate.now().atTime(23, 59, 59);
        System.out.println("endTime:" + endTime);
        //如果小于今天的开始日期
        if (localTime.isBefore(startTime)) {

            /**判断是否小于昨天，小于昨天证明签到不连续，签到记录表签到连续次数设置为0*/
            Date newTime = new Date();
            //将下面的 理解成  yyyy-MM-dd 00：00：00 更好理解点
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            String todayStr = format.format(newTime);
            Date today = format.parse(todayStr);
            //昨天 86400000=24*60*60*1000 一天  大于昨天 至少为前天
            if ((today.getTime() - date.getTime()) > 86400000) {
                result = 2;
                System.out.println("小于今天的开始日期,至少为前天的时间,连续签到终止");
            } else {
                result = 0;
                System.out.println("小于今天的开始日期,最后一次签到是昨天，连续签到未终止");
            }
        }
        //如果大于今天的开始日期，小于今天的结束日期
        if (localTime.isAfter(startTime) && localTime.isBefore(endTime)) {
            System.out.println("大于今天的开始日期，小于今天的结束日期");
            result = 1;
        }
        //如果大于今天的结束日期
        if (localTime.isAfter(endTime)) {
            System.out.println("大于今天的结束日期");
            result = 1;
        }
        return result;
    }
}




